(function (g) {
    function s (a, b, d) {
        return 'rgba(' + [Math.round(a[0] + (b[0] - a[0]) * d), Math.round(a[1] + (b[1] - a[1]) * d), Math.round(a[2] + (b[2] - a[2]) * d), a[3] + (b[3] - a[3]) * d].join(',') + ')'
    }

    var t = function () {},
        o = g.getOptions(),
        i = g.each,
        p = g.extend,
        x = g.format,
        q = g.wrap,
        l = g.Chart,
        n = g.seriesTypes,
        u = n.pie,
        m = n.column,
        v = HighchartsAdapter.fireEvent,
        y = HighchartsAdapter.inArray
    p(o.lang, {
        drillUpText: '◁ 返回 {series.name}'
    })
    o.drilldown = {
        activeAxisLabelStyle: {
            cursor: 'pointer',
            color: '#0d233a',
            fontWeight: 'bold',
            textDecoration: 'underline'
        },
        activeDataLabelStyle: {
            cursor: 'pointer',
            color: '#0d233a',
            fontWeight: 'bold',
            textDecoration: 'underline'
        },
        animation: {
            duration: 500
        },
        drillUpButton: {
            position: {
                align: 'right',
                x: -10,
                y: 10
            }
        }
    }
    g.SVGRenderer.prototype.Element.prototype.fadeIn = function (a) {
        this.attr({
            opacity: 0.1,
            visibility: 'inherit'
        }).animate({
                opacity: 1
            },
            a || {
                duration: 250
            })
    }
    l.prototype.addSeriesAsDrilldown = function (a, b) {
        this.addSingleSeriesAsDrilldown(a, b)
        this.applyDrilldown()
    }
    l.prototype.addSingleSeriesAsDrilldown = function (a, b) {
        var d = a.series,
            c = d.xAxis,
            f = d.yAxis,
            h
        h = a.color || d.color
        var e, w = [],
            g = [],
            k
        k = d.levelNumber || 0
        b = p({
                color: h
            },
            b)
        e = y(a, d.points)
        i(d.chart.series,
            function (a) {
                if (a.xAxis === c) w.push(a),
                    g.push(a.userOptions),
                    a.levelNumber = a.levelNumber || 0
            })
        h = {
            levelNumber: k,
            seriesOptions: d.userOptions,
            levelSeriesOptions: g,
            levelSeries: w,
            shapeArgs: a.shapeArgs,
            bBox: a.graphic.getBBox(),
            color: h,
            lowerSeriesOptions: b,
            pointOptions: d.options.data[e],
            pointIndex: e,
            oldExtremes: {
                xMin: c && c.userMin,
                xMax: c && c.userMax,
                yMin: f && f.userMin,
                yMax: f && f.userMax
            }
        }
        if (!this.drilldownLevels) this.drilldownLevels = []
        this.drilldownLevels.push(h)
        h = h.lowerSeries = this.addSeries(b, !1)
        h.levelNumber = k + 1
        if (c) c.oldPos = c.pos,
            c.userMin = c.userMax = null,
            f.userMin = f.userMax = null
        if (d.type === h.type) h.animate = h.animateDrilldown || t,
            h.options.animation = !0
    }
    l.prototype.applyDrilldown = function () {
        var a = this.drilldownLevels,
            b = a[a.length - 1].levelNumber
        i(this.drilldownLevels,
            function (a) {
                a.levelNumber === b && i(a.levelSeries,
                    function (a) {
                        a.levelNumber === b && a.remove(!1)
                    })
            })
        this.redraw()
        this.showDrillUpButton()
    }
    l.prototype.getDrilldownBackText = function () {
        var a = this.drilldownLevels[this.drilldownLevels.length - 1]
        a.series = a.seriesOptions
        return x(this.options.lang.drillUpText, a)
    }
    l.prototype.showDrillUpButton = function () {
        var a = this,
            b = this.getDrilldownBackText(),
            d = a.options.drilldown.drillUpButton,
            c,
            f
        this.drillUpButton ? this.drillUpButton.attr({
            text: b
        }).align() : (f = (c = d.theme) && c.states, this.drillUpButton = this.renderer.button(b, null, null,
            function () {
                a.drillUp()
            },
            c, f && f.hover, f && f.select).attr({
            align: d.position.align,
            zIndex: 9
        }).add().align(d.position, !1, d.relativeTo || 'plotBox'))
    }
    l.prototype.drillUp = function () {
        for (var a = this,
                 b = a.drilldownLevels,
                 d = b[b.length - 1].levelNumber, c = b.length, f = a.series, h = f.length, e, g, j, k, l = function (b) {
                var c
                i(f,
                    function (a) {
                        a.userOptions === b && (c = a)
                    })
                c = c || a.addSeries(b, !1)
                if (c.type === g.type && c.animateDrillupTo) c.animate = c.animateDrillupTo
                b === e.seriesOptions && (j = c)
            }; c--;) if (e = b[c], e.levelNumber === d) {
            b.pop()
            g = e.lowerSeries
            if (!g.chart) for (; h--;) if (f[h].options.id === e.lowerSeriesOptions.id) {
                g = f[h]
                break
            }
            g.xData = []
            i(e.levelSeriesOptions, l)
            v(a, 'drillup', {
                seriesOptions: e.seriesOptions
            })
            if (j.type === g.type) j.drilldownLevel = e,
                j.options.animation = a.options.drilldown.animation,
            g.animateDrillupFrom && g.animateDrillupFrom(e)
            j.levelNumber = d
            g.remove(!1)
            if (j.xAxis) k = e.oldExtremes,
                j.xAxis.setExtremes(k.xMin, k.xMax, !1),
                j.yAxis.setExtremes(k.yMin, k.yMax, !1)
        }
        this.redraw()
        this.drilldownLevels.length === 0 ? this.drillUpButton = this.drillUpButton.destroy() : this.drillUpButton.attr({
            text: this.getDrilldownBackText()
        }).align()
    }
    m.prototype.supportsDrilldown = !0
    m.prototype.animateDrillupTo = function (a) {
        if (!a) {
            var b = this,
                d = b.drilldownLevel
            i(this.points,
                function (a) {
                    a.graphic.hide()
                    a.dataLabel && a.dataLabel.hide()
                    a.connector && a.connector.hide()
                })
            setTimeout(function () {
                    i(b.points,
                        function (a, b) {
                            var h = b === (d && d.pointIndex) ? 'show' : 'fadeIn',
                                e = h === 'show' ? !0 : void 0
                            a.graphic[h](e)
                            if (a.dataLabel) a.dataLabel[h](e)
                            if (a.connector) a.connector[h](e)
                        })
                },
                Math.max(this.chart.options.drilldown.animation.duration - 50, 0))
            this.animate = t
        }
    }
    m.prototype.animateDrilldown = function (a) {
        var b = this,
            d = this.chart.drilldownLevels,
            c = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1].shapeArgs,
            f = this.chart.options.drilldown.animation
        if (!a) i(d,
            function (a) {
                if (b.userOptions === a.lowerSeriesOptions) c = a.shapeArgs
            }),
            c.x += this.xAxis.oldPos - this.xAxis.pos,
            i(this.points,
                function (a) {
                    a.graphic && a.graphic.attr(c).animate(a.shapeArgs, f)
                    a.dataLabel && a.dataLabel.fadeIn(f)
                }),
            this.animate = null
    }
    m.prototype.animateDrillupFrom = function (a) {
        var b = this.chart.options.drilldown.animation,
            d = this.group,
            c = this
        i(c.trackerGroups,
            function (a) {
                if (c[a]) c[a].on('mouseover')
            })
        delete this.group
        i(this.points,
            function (c) {
                var h = c.graphic,
                    e = g.Color(c.color).rgba,
                    i = g.Color(a.color).rgba,
                    j = function () {
                        h.destroy()
                        d && (d = d.destroy())
                    }
                h && (delete c.graphic, b ? h.animate(a.shapeArgs, g.merge(b, {
                    step: function (a, b) {
                        b.prop === 'start' && e.length === 4 && i.length === 4 && this.attr({
                            fill: s(e, i, b.pos)
                        })
                    },
                    complete: j
                })) : (h.attr(a.shapeArgs), j()))
            })
    }
    u && p(u.prototype, {
        supportsDrilldown: !0,
        animateDrillupTo: m.prototype.animateDrillupTo,
        animateDrillupFrom: m.prototype.animateDrillupFrom,
        animateDrilldown: function (a) {
            var b = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],
                d = this.chart.options.drilldown.animation,
                c = b.shapeArgs,
                f = c.start,
                h = (c.end - f) / this.points.length,
                e = g.Color(b.color).rgba
            if (!a) i(this.points,
                function (a, b) {
                    var i = g.Color(a.color).rgba
                    a.graphic.attr(g.merge(c, {
                        start: f + b * h,
                        end: f + (b + 1) * h
                    }))[d ? 'animate' : 'attr'](a.shapeArgs, g.merge(d, {
                        step: function (a, b) {
                            b.prop === 'start' && e.length === 4 && i.length === 4 && this.attr({
                                fill: s(e, i, b.pos)
                            })
                        }
                    }))
                }),
                this.animate = null
        }
    })
    g.Point.prototype.doDrilldown = function (a) {
        for (var b = this.series.chart,
                 d = b.options.drilldown,
                 c = (d.series || []).length, f; c-- && !f;) d.series[c].id === this.drilldown && (f = d.series[c]);
        v(b, 'drilldown', {
            point: this,
            seriesOptions: f
        })
        f && (a ? b.addSingleSeriesAsDrilldown(this, f) : b.addSeriesAsDrilldown(this, f))
    }
    q(g.Point.prototype, 'init',
        function (a, b, d, c) {
            var f = a.call(this, b, d, c),
                h = b.chart,
                e = (a = b.xAxis && b.xAxis.ticks[c]) && a.label
            if (f.drilldown) {
                if (g.addEvent(f, 'click',
                        function () {
                            f.doDrilldown()
                        }), e) {
                    if (!e._basicStyle) e._basicStyle = e.element.getAttribute('style')
                    e.addClass('highcharts-drilldown-axis-label').css(h.options.drilldown.activeAxisLabelStyle).on('click',
                        function () {
                            i(e.ddPoints,
                                function (a) {
                                    a.doDrilldown && a.doDrilldown(!0)
                                })
                            h.applyDrilldown()
                        })
                    if (!e.ddPoints) e.ddPoints = []
                    e.ddPoints.push(f)
                }
            } else e && e._basicStyle && e.element.setAttribute('style', e._basicStyle)
            return f
        })
    q(g.Series.prototype, 'drawDataLabels',
        function (a) {
            var b = this.chart.options.drilldown.activeDataLabelStyle
            a.call(this)
            i(this.points,
                function (a) {
                    if (a.drilldown && a.dataLabel) a.dataLabel.attr({
                        'class': 'highcharts-drilldown-data-label'
                    }).css(b).on('click',
                        function () {
                            a.doDrilldown()
                        })
                })
        })
    var r, o = function (a) {
        a.call(this)
        i(this.points,
            function (a) {
                a.drilldown && a.graphic && a.graphic.attr({
                    'class': 'highcharts-drilldown-point'
                }).css({
                    cursor: 'pointer'
                })
            })
    }
    for (r in n) n[r].prototype.supportsDrilldown && q(n[r].prototype, 'drawTracker', o)
})(Highcharts)